package priv.pattern.commandmode.notoperation;

/*
 * 作者：m鹏h
 * 时间；2024/8/8 23:40
 * 描述：计算器类，上边有加法、减法、撤销和恢复按钮
 **/

import lombok.Data;
import priv.pattern.commandmode.notoperation.service.Command;

import java.util.ArrayList;
import java.util.List;

@Data
public class Calculator {

 /**
  * 操作的命令的记录，撤销时用
  */
 private List<Command> undoCmds = new ArrayList();
 /**
  * 撤销的命令的记录，恢复时用
  */
 private List<Command> redoCmds = new ArrayList();

 private Command addCommand = null;
 private Command substractCommand = null;

 /**
  * 执行加法操作
  */
 public void addPressed(){
  this.addCommand.execute();
  //把操作记录到历史记录里面
  undoCmds.add(this.addCommand);
 }

 /**
  * 执行减法操作
  */
 public void substractPressed(){
  this.substractCommand.execute();
  //把操作记录到历史记录里面
  undoCmds.add(substractCommand);
 }

 /**
  * 撤销一步操作
  */
 public void undoPressed(){
  if(this.undoCmds.size()>0){
   //取出最后一个命令来撤销
   Command cmd = this.undoCmds.get(this.undoCmds.size()-1);
   cmd.undo();
   //把这个命令记录到恢复的历史记录里面
   this.redoCmds.add(cmd );
   //把最后一个命令删除掉，
   this.undoCmds.remove(cmd);
  }else{
   System.out.println("很抱歉，没有可撤销的命令");
  }
 }

 /**
  * 恢复一步操作
  */
 public void redoPressed(){
  if(this.redoCmds.size()>0){
   //取出最后一个命令来恢复
   Command cmd = this.redoCmds.get(this.redoCmds.size()-1);
   cmd.execute();
   //把命令记录到可撤销的历史记录里面
   this.undoCmds.add(cmd);
   //把最后一个命令删除掉
   this.redoCmds.remove(cmd);
  }else{
   System.out.println("很抱歉，没有可恢复的命令");
  }
 }
}
